/*
 * @Author       : Xu Xiaokang
 * @Email        :
 * @Date         : 2025-04-24 22:04:45
 * @LastEditors  : Xu Xiaokang
 * @LastEditTime : 2025-05-22 22:39:01
 * @Filename     :
 * @Description  :
*/

/*
! 模块功能: ROM顶层文件, 实例化自编ROM与Vivado的BRAM IP，此模块用于功能测试
* 思路:
* 1.作为功能测试，使用en信号，使用初始化文件和输出寄存器
~ 注意:
~ 1.
% 其它
*/

`default_nettype none

module mySPROM_Top_function
#(
  parameter RAM_STYLE = "block", //* RAM类型, 可选"block"(默认), "distributed"
  parameter DATA_WIDTH = 8, //* 数据位宽, 可选1, 2, 3, ..., 默认为8
  parameter ADDR_WIDTH = 6, //* RAM地址位宽, 对应RAM深度, 可选1, 2, 3, ..., 默认为6, 对应深度2**6=64
  parameter USE_ENA = 0, //* 启用ENA信号
  parameter OUTPUT_REG_NUM_A = 1, //* A端口输出寄存器数量, 可选0(默认), 1, 2
  parameter INIT_FILE = "", //* 初始化文件名，空(默认)表示不初始化，示例目录C:\_myJGY\ram_init.coe
  /*
  * 默认初始值, 在未指定初始化文件或初始化文件行数比RAM深度小时起作用, 使用16进制表示, 默认值0,
  * 对应Vivado BRAM IP的功能Fill Remaining Memory Locations
  */
  parameter [DATA_WIDTH-1:0] INIT_VALUE_HEX = 'h0
)(
  input  wire                   clka,  //* A端口时钟
  input  wire                   ena,   //* A端口操作使能
  input  wire [ADDR_WIDTH-1:0]  addra, //* A端口读/写地址
  output wire [DATA_WIDTH-1:0]  douta, //* A端口输出数据
  output wire [DATA_WIDTH-1:0]  vivado_douta //* A端口输出数据
);


//++ 实例化Vivado RAM IP ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
blk_mem_gen_0 your_instance_name (
  .clka  (clka ), // input wire clka
  .ena   (ena  ),
  .addra (addra), // input wire [3  : 0] addra
  .douta (vivado_douta) // output wire [15: 0] douta
);
//-- 实例化Vivado RAM IP ------------------------------------------------------------


//++ 实例化自编RAM IP ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mySPROM # (
  .RAM_STYLE        (RAM_STYLE       ),
  .DATA_WIDTH       (DATA_WIDTH      ),
  .ADDR_WIDTH       (ADDR_WIDTH      ),
  .USE_ENA          (USE_ENA         ),
  .OUTPUT_REG_NUM_A (OUTPUT_REG_NUM_A),
  .INIT_FILE        (INIT_FILE       ),
  .INIT_VALUE_HEX   (INIT_VALUE_HEX)
) mySPROM_inst (
  .clka  (clka ),
  .ena   (ena  ),
  .addra (addra),
  .douta (douta)
);
//-- 实例化自编RAM IP ------------------------------------------------------------


endmodule
`resetall